package cn.liangxxhu.rocketmq.core.strategy;

import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@RequiredArgsConstructor
/**
 * 消息发送策略工厂：在容器启动时收集所有策略实现并建立映射，
 * 运行期按消息类型选择对应策略。
 */
public class MessageSendStrategyFactory  {

    // 策略映射：key=消息类型（String），value=对应的发送策略
    private static final Map<String, MessageSendStrategy> sendStrategyMap = new ConcurrentHashMap<>();
    // Spring 自动注入所有 MessageSendStrategy 接口的实现类
    private final List<MessageSendStrategy> sendStrategyList;

    /**
     * 初始化策略映射（容器启动后执行）。
     */
    @PostConstruct
    private void init() {
        sendStrategyList.forEach(sendStrategy -> {
            sendStrategyMap.put(sendStrategy.getMessageType(), sendStrategy);
        });
    }

    /**
     * 根据消息类型获取对应的发送策略。
     *
     * @param messageType 消息类型编码（如 NORMAL/DELAY）
     * @return 对应的消息发送策略
     * @throws IllegalArgumentException 如果没有找到对应的策略
     */
    public MessageSendStrategy getMessageSendStrategy(String messageType) {
        MessageSendStrategy strategy = sendStrategyMap.get(messageType);
        if (strategy == null) {
            throw new IllegalArgumentException("未找到类型为[" + messageType + "]的消息发送策略");
        }
        return strategy;
    }

}
